package com.tp2.dominio;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.log4j.Logger;

import com.tp2.dao.ParserProductos;

public class Sucursal {

	private static Logger logger = Logger.getLogger(Sucursal.class);
//	private static Sucursal instance;
	private int numeroSucursal;
	private String nombre;
	private Collection<Caja> cajas;
	
	private Map<Integer, Collection<Ticket> > ticketsHistoricos;
	private Collection<Producto> productos;
	
	
	public Sucursal(int numero, String nombre, int cantidadDeCajas){
		
		this.cajas = new ArrayList<Caja>();
		this.ticketsHistoricos = new HashMap<Integer, Collection<Ticket>>();
		for (int i = 1; i < cantidadDeCajas; i++) {
			this.cajas.add(new Caja(i, this));
			this.ticketsHistoricos.put(i, new ArrayList<Ticket>());
		}
		
		ParserProductos parser = new ParserProductos("inventarioProductosTest.xml");
		setProductos(parser.getProductos());
	}
	
	public Collection<Caja> getCajas() {
		return cajas;
	}

	public void setCajas(Collection<Caja> cajas) {
		this.cajas = cajas;
	}

	public Map<Integer ,Collection<Ticket> > getTicketsHistoricos() {
		return ticketsHistoricos;
	}

	public void setTicketsHistoricos(Map<Integer ,Collection<Ticket> > ticketsHistoricos) {
		this.ticketsHistoricos = ticketsHistoricos;
	}
	
	public Collection<Producto> getProductos() {
		return productos;
	}

	public void setProductos(Collection<Producto> productos) {
		this.productos = productos;
	}
	
	public void agregarTicketsDelDia(Integer numeroDeCaja ,Collection<Ticket> ticketsDelDia){
		Collection<Ticket> ticketsDeLaCaja = ticketsHistoricos.get(numeroDeCaja);
		if(ticketsDeLaCaja == null){
			ticketsDeLaCaja = new ArrayList<Ticket>();
		}
		ticketsDeLaCaja.addAll(ticketsDelDia);
		ticketsHistoricos.put(numeroDeCaja, ticketsDeLaCaja);
	}
	
	public List<ProductoRanking> calcularRankingDeProductosVendidos(){

		List<ProductoRanking> productosRanking = new ArrayList<ProductoRanking>();
		for(Entry<Integer, Collection<Ticket>> caja: this.ticketsHistoricos.entrySet()){
			for(Ticket ticket: caja.getValue()){
				Collection<ProductoRanking> rankingDeProductosPorTicket = 
						ticket.rankingDeProductos();
				for(ProductoRanking pr: rankingDeProductosPorTicket){
					if(productosRanking.contains(pr)){

						int posEncontrada = ( productosRanking).indexOf(pr);
						if(posEncontrada != -1){
					
							int cantidadActual = productosRanking.get(posEncontrada).getCantidad();
							productosRanking.get(posEncontrada).setCantidad(cantidadActual+pr.getCantidad());
						}
					}else{
						productosRanking.add(pr);
					}
				}
			}
		}
		try {
			logRanking(productosRanking);
		} catch (Exception e) {
			logger.error(e);
		}
		
		return productosRanking;
	}

	private void logRanking(List<ProductoRanking> productosRanking) throws Exception {
		Collections.sort((List<ProductoRanking>) productosRanking);
		logger.info("-----------------------------------------------------------");
		logger.info("RANKING DE PRODUCTOS ");
		logger.info("");
		for(ProductoRanking productoRanking: productosRanking){
			Producto productoToLog = obtenerProducto(productoRanking.getCodigo());
			logger.info("Producto: " + productoToLog.getNombre()
					+ " Total vendido: " + productoRanking.getCantidad());
		}
		logger.info("");
		logger.info("-----------------------------------------------------------");
	}
	
	//TODO ver como hacer para que la caja consulte estos
	public Producto obtenerProducto(String codigoProducto) throws Exception {

		for (Producto producto : productos) {

			if (producto.getCodigo().equals(codigoProducto))
				return producto;
		}

		throw new Exception("Producto no encontrado");
	}

	public int getNumeroSucursal() {
		return numeroSucursal;
	}

	public void setNumeroSucursal(int numeroSucursal) {
		this.numeroSucursal = numeroSucursal;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	
}
